package com.泛型;

import java.util.ArrayList;
import java.util.List;

@SuppressWarnings("all")
public class 泛型的继承和通配符 {
    /** ? = 通配符
     *1.泛型类型不具备继承；
     * 2.<?>指 支持任意泛型类型
     * 3.<? extends AAA> 指 支持泛型类型为 A类及其子类，规定最大上限（只能传入泛型类型是 A类或继承了A类的泛型）
     * 4.<? super AAA> 指 支持泛型类型为AAA类或AAA泛型的父类
     */
    public static void main(String[] args) {
        Object obj = new String("haha");
         //ArrayList<Object> list = new ArrayList<String>();
        // 1.泛型类型不具备继承

        ArrayList<Double> a1 = new ArrayList<>();
        ArrayList<Object> a2 = new ArrayList<>();
        ArrayList<AAA>    a3 = new ArrayList<>();
        ArrayList<BBB>    a4 = new ArrayList<>();
        ArrayList<CCC>    a5 = new ArrayList<>();
        ArrayList<DDD>    a6 = new ArrayList<>();

        //2.<?>指 支持任意泛型类型
        fun1(a1);
        fun1(a2);
        fun1(a3);
        fun1(a4);

        //3.<? extends AAA> 指 支持泛型类型为 A类及其子类，规定最大上限（只能传入泛型类型是 A类或继承了A类的泛型）
//        fun2(a2);  Object 不是 AAA的子类，所以失败
        fun2(a3); //AAA
        fun2(a4); //BBB extends AAA
        fun2(a5);  //CCC ectends BBB extends AAA
        fun2(a6);  //DDD extends CCC ectends BBB extends AAA

        //3.<? super BBB> 支持泛型类型为BBB类或BBB泛型的父类
        fun3(a2); //BB extends Object
        fun3(a3); //BBB extends AAA
        fun3(a4); //BBB
//        fun3(a5);  CCC是BB的子类，不能放；

    }
    static void fun1(List<?> list){
        //支持任意泛型类型
    }
    static void fun2(List<? extends AAA> list){
        //支持泛型类型为 AAA类及其子类，规定最大上限（只能传入泛型类型是 AAA类或继承了AAA类的泛型）
    }
    static void fun3(List<? super BBB> list){
        //支持泛型类型为BBB类或BBB泛型的父类
    }
}
class AAA{ }

class BBB extends AAA{}

class CCC extends BBB{}

class DDD extends CCC{}